package com.haike.pushjobs.codegenerate;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.converts.DmTypeConvert;
import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
import com.baomidou.mybatisplus.generator.config.rules.IColumnType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.VelocityTemplateEngine;

/**
 * 教程: https://blog.csdn.net/Flying_Fish_roe/article/details/142435279
 */
public class CodeGenerator {

    public static void main(String[] args) {

        String tableList ="t_yubao_sml";
        // 1. 创建代码生成器
        AutoGenerator generator = new AutoGenerator();

        // 2. 全局配置
        GlobalConfig globalConfig = new GlobalConfig();
        String projectPath = System.getProperty("user.dir");  // 项目路径
        globalConfig.setOutputDir(projectPath + "/push-jobs/src/main/java");  // 输出目录
        globalConfig.setAuthor("Your Name");  // 作者
        globalConfig.setFileOverride(true);
        globalConfig.setOpen(false);  // 生成后是否打开资源管理器
        globalConfig.setIdType(IdType.ASSIGN_ID);
//        globalConfig.setSwagger2(true);  // 开启 Swagger2 注解
        globalConfig.setServiceName("%sService");  // 去掉 Service 接口的首字母 I
        generator.setGlobalConfig(globalConfig);

        // 配置模板
        TemplateConfig templateConfig = new TemplateConfig();
        templateConfig.setController("");   //控制 不生成 controller  空字符串就行
        generator.setTemplate(templateConfig);


        // 3. 数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl("jdbc:postgresql://123.249.45.90:15432/glcb");
//        dsc.setSchemaName("glcb");
        dsc.setDriverName("org.postgresql.Driver");
        dsc.setUsername("postgres");
        dsc.setPassword("Ctop@2025");
        dsc.setDbType(DbType.DM);
        // TypeConvert教程
        // https://blog.csdn.net/qq_38798644/article/details/134968649
        // https://blog.csdn.net/m0_67390788/article/details/126463139
//        dsc.setTypeConvert(new ITypeConvert() {
//                               @Override
//                               public IColumnType processTypeConvert(GlobalConfig globalConfig, String fieldType) {
//                                   String t = fieldType.toLowerCase();
//                                   if (t.contains("number")) {
//                                       return DbColumnType.BIG_DECIMAL;
//                                   }
//                                   if (t.contains("bigint")) {
//                                       return DbColumnType.LONG;
//                                   }
//                                   if (t.contains("clob")) {
//                                       return DbColumnType.STRING;
//                                   }
//                                   //其它字段采用默认转换（非mysql数据库可以使用其它默认的数据库转换器）
//                                   return new DmTypeConvert().processTypeConvert(globalConfig, fieldType);
//                               }
//                           }
//        );
        generator.setDataSource(dsc);

        // 4. 包配置
        PackageConfig packageConfig = new PackageConfig();
        packageConfig.setParent("com.haike.pushjobs");  // 父包名
        packageConfig.setModuleName("");  // 模块名
        generator.setPackageInfo(packageConfig);

        // 5. 策略配置
        StrategyConfig strategyConfig = new StrategyConfig();
        strategyConfig.setNaming(NamingStrategy.underline_to_camel);  // 表名生成策略
        strategyConfig.setColumnNaming(NamingStrategy.underline_to_camel);  // 字段名生成策略
        strategyConfig.setEntityLombokModel(true);  // 自动生成 Lombok 注解
        strategyConfig.setRestControllerStyle(true);  // 生成 Rest 风格的 Controller
        strategyConfig.setInclude(tableList.split(","));  // 需要生成的表名（多个表可以使用逗号分隔）
        strategyConfig.setControllerMappingHyphenStyle(true);  // URL 中驼峰转连字符

        generator.setStrategy(strategyConfig);

        // 6. 配置模板引擎
        generator.setTemplateEngine(new VelocityTemplateEngine());

        // 7. 执行生成操作
        generator.execute();
    }
}
